#include "CodeTable.h"


CodeTable::CodeTable() : tables(CharType::typeCount)
{
    tables[CharType::CONTROL].insert("DATA"   , 0);
    tables[CharType::CONTROL].insert("EXIT"   , 1);
    tables[CharType::CONTROL].insert("ABORT"  , 2);
    tables[CharType::CONTROL].insert("VALID"  , 3);
    tables[CharType::CONTROL].insert("INVALID", 4);
    tables[CharType::CONTROL].insert("TIMEOUT", 5);

    tables[CharType::DATA].insert("ANYDATA",  0);

    tables[CharType::DATA].insert("NUL",  0);
    tables[CharType::DATA].insert("SOH",  1);
    tables[CharType::DATA].insert("STX",  2);
    tables[CharType::DATA].insert("ETX",  3);
    tables[CharType::DATA].insert("EOT",  4);
    tables[CharType::DATA].insert("ENQ",  5);
    tables[CharType::DATA].insert("ACK",  6);
    tables[CharType::DATA].insert("LF" , 10);
    tables[CharType::DATA].insert("CR" , 13);
    tables[CharType::DATA].insert("NAK", 21);
    tables[CharType::DATA].insert("SYN", 22);
    tables[CharType::DATA].insert("ETB", 23);
    tables[CharType::DATA].insert("GS" , 29);
    tables[CharType::DATA].insert("RS" , 30);
    tables[CharType::DATA].insert("SP" , 32);

    for (unsigned i = 0; i < 256; ++i)
    {
        tables[CharType::DATA].insert(QString("%1").arg(i, 0, 10), i);
        tables[CharType::DATA].insert(QString("%1").arg(i, 0, 16), i);
    }
}

Char CodeTable::Encode(const QString& character, int* type)
{   
    int index = 0;

    for (; index != tables.size() && !tables[index].contains(character); ++index);
    if (type) *type = index;

    return (index != tables.size()) ? tables[index][character] : 0; 
}

